using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._GeostatisticalAnalystTools._WorkingwithGeostatisticalLayers
{
    /// <summary>
    /// <para>GA Layer 3D To NetCDF</para>
    /// <para>Exports one or more 3D geostatistical layers created using the Empirical Bayesian Kriging 3D tool to netCDF format (*.nc file). The primary purpose of this tool is to prepare the 3D geostatistical layers for visualization as a voxel layer in a local scene.</para>
    /// <para>将使用经验贝叶斯克里金法 3D 工具创建的一个或多个 3D 地统计图层导出为 netCDF 格式（*.nc 文件）。此工具的主要用途是准备 3D 地统计图层，以便在局部场景中将其可视化为体素图层。</para>
    /// </summary>    
    [DisplayName("GA Layer 3D To NetCDF")]
    public class GALayer3DToNetCDF : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public GALayer3DToNetCDF()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_3d_geostat_layers">
        /// <para>Input 3D geostatistical layers</para>
        /// <para>The 3D geostatistical layers that will be exported to the Output netCDF file. If more than one layer is provided, the output will be a multivariate netCDF file.</para>
        /// <para>将导出到输出 netCDF 文件的 3D 地统计图层。如果提供了多个图层，则输出将是一个多变量 netCDF 文件。</para>
        /// </param>
        /// <param name="_out_netcdf_file">
        /// <para>Output netCDF file</para>
        /// <para>The output netCDF file containing the exported values from the Input 3D geostatistical layers.</para>
        /// <para>输出 netCDF 文件，其中包含从输入 3D 地统计图层导出的值。</para>
        /// </param>
        public GALayer3DToNetCDF(List<object> _in_3d_geostat_layers, object _out_netcdf_file)
        {
            this._in_3d_geostat_layers = _in_3d_geostat_layers;
            this._out_netcdf_file = _out_netcdf_file;
        }
        public override string ToolboxName => "Geostatistical Analyst Tools";

        public override string ToolName => "GA Layer 3D To NetCDF";

        public override string CallName => "ga.GALayer3DToNetCDF";

        public override List<string> AcceptEnvironments => ["extent", "geographicTransformations", "outputCoordinateSystem", "parallelProcessingFactor", "workspace"];

        public override object[] ParameterInfo => [_in_3d_geostat_layers, _out_netcdf_file, _export_locations.GetGPValue(), _x_spacing, _y_spacing, _elevation_spacing, _in_points_3d, _output_variables, _in_study_area];

        /// <summary>
        /// <para>Input 3D geostatistical layers</para>
        /// <para>The 3D geostatistical layers that will be exported to the Output netCDF file. If more than one layer is provided, the output will be a multivariate netCDF file.</para>
        /// <para>将导出到输出 netCDF 文件的 3D 地统计图层。如果提供了多个图层，则输出将是一个多变量 netCDF 文件。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input 3D geostatistical layers")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public List<object> _in_3d_geostat_layers { get; set; }


        /// <summary>
        /// <para>Output netCDF file</para>
        /// <para>The output netCDF file containing the exported values from the Input 3D geostatistical layers.</para>
        /// <para>输出 netCDF 文件，其中包含从输入 3D 地统计图层导出的值。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output netCDF file")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_netcdf_file { get; set; }


        /// <summary>
        /// <para>Export locations</para>
        /// <para><xdoc>
        ///   <para>Specifies the locations to export from the Input 3D geostatistical layers. You can export to 3D gridded points or provide custom 3D point features to represent the export locations. If you choose 3D gridded points, you must provide values for the X spacing, Y spacing, and Elevation spacing parameters that represent the distance between each gridded point in all dimensions. If you choose Custom 3D points, you must provide 3D point features in the 3D point locations parameter representing the locations to export.</para>
        ///   <bulletList>
        ///     <bullet_item>3D gridded points—Prediction locations are 3D gridded points. This is the default.</bullet_item><para/>
        ///     <bullet_item>Custom 3D points—Prediction locations are defined by custom 3D point features.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定要从输入 3D 地统计图层导出的位置。您可以导出为 3D 网格点或提供自定义 3D 点要素来表示导出位置。如果选择 3D 网格点，则必须提供 X 间距、Y 间距和高程间距参数的值，这些参数表示所有维度中每个网格点之间的距离。如果选择自定义 3D 点，则必须在表示要导出的位置的 3D 点位置参数中提供 3D 点要素。</para>
        ///   <bulletList>
        ///     <bullet_item>3D 格网点 - 预测位置为 3D 格网点。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>自定义 3D 点 - 预测位置由自定义 3D 点要素定义。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Export locations")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _export_locations_value _export_locations { get; set; } = _export_locations_value._3D_GRIDDED_POINTS;

        public enum _export_locations_value
        {
            /// <summary>
            /// <para>3D gridded points</para>
            /// <para>3D gridded points—Prediction locations are 3D gridded points. This is the default.</para>
            /// <para>3D 格网点 - 预测位置为 3D 格网点。这是默认设置。</para>
            /// </summary>
            [Description("3D gridded points")]
            [GPEnumValue("3D_GRIDDED_POINTS")]
            _3D_GRIDDED_POINTS,

            /// <summary>
            /// <para>Custom 3D points</para>
            /// <para>Custom 3D points—Prediction locations are defined by custom 3D point features.</para>
            /// <para>自定义 3D 点 - 预测位置由自定义 3D 点要素定义。</para>
            /// </summary>
            [Description("Custom 3D points")]
            [GPEnumValue("CUSTOM_3D_POINTS")]
            _CUSTOM_3D_POINTS,

        }

        /// <summary>
        /// <para>X spacing</para>
        /// <para>The spacing between each gridded point in the x-dimension. The default value creates 40 points along the output x-extent.</para>
        /// <para>x 维中每个网格点之间的间距。默认值沿输出 x 范围创建 40 个点。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("X spacing")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public string? _x_spacing { get; set; } = null;


        /// <summary>
        /// <para>Y spacing</para>
        /// <para>The spacing between each gridded point in the y-dimension. The default value creates 40 points along the output y-extent.</para>
        /// <para>y 维中每个网格点之间的间距。默认值沿输出 y 范围创建 40 个点。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Y spacing")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public string? _y_spacing { get; set; } = null;


        /// <summary>
        /// <para>Elevation spacing</para>
        /// <para>The spacing between each gridded point in the elevation (z) dimension. The default value creates 40 points along the output z-extent.</para>
        /// <para>高程 （z） 维度中每个网格点之间的间距。默认值沿输出 z 范围创建 40 个点。</para>
        /// <para>单位： Inches | Feet | Yards | Miles | NauticalMiles | Millimeters | Centimeters | Decimeters | Meters | Kilometers </para>
        /// </summary>
        [DisplayName("Elevation spacing")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public string? _elevation_spacing { get; set; } = null;


        /// <summary>
        /// <para>3D point locations</para>
        /// <para>The 3D point features representing locations to export. The point features must have their elevations stored in the Shape.Z geometry attribute.</para>
        /// <para>表示要导出的位置的 3D 点要素。点要素的高程必须存储在 Shape.Z 几何属性中。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("3D point locations")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _in_points_3d { get; set; } = null;


        /// <summary>
        /// <para>Output variables</para>
        /// <para><xdoc>
        ///   <para>Specifies the output types for the Input 3D geostatistical layers. You can specify one or more output types for each of the layers or you can apply an output type to all input geostatistical layers. By default, the predictions for all layers will be exported.</para>
        ///   <para>To export other output types, specify the layer to export (or choose All to specify all layers) in the first entry of the value table. Specify the output type in the second entry of the value table. If you choose Probability or Quantile as the output type, specify the threshold value (for probability) or the quantile value (for quantile) in the third entry of the value table. If you choose Prediction or Prediction standard error as the output type, you can leave the third entry in the value table empty.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定输入 3D 地统计图层的输出类型。您可以为每个图层指定一个或多个输出类型，也可以将输出类型应用于所有输入地统计图层。默认情况下，将导出所有图层的预测。</para>
        ///   <para>要导出其他输出类型，请在值表的第一个条目中指定要导出的图层（或选择全部以指定所有图层）。在值表的第二个条目中指定输出类型。如果选择“概率”或“分位数”作为输出类型，请在值表的第三个条目中指定阈值（对于概率）或分位数值（对于分位数）。如果选择“预测”或“预测标准误差”作为输出类型，则可以将值表中的第三个条目留空。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output variables")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _output_variables { get; set; } = null;


        /// <summary>
        /// <para>Input study area polygons</para>
        /// <para>The polygon features that represent the study area. Only points that are within the study area are saved in the output netCDF file. When visualized as a voxel layer, only voxels within the study area will display in the scene. Points are determined to be inside or outside of the study area using only their x- and y-coordinates.</para>
        /// <para>表示研究区域的面要素。只有研究区域内的点才会保存在输出 netCDF 文件中。可视化为体素图层时，场景中只会显示研究区域内的体素。仅使用点的 x 和 y 坐标确定点位于研究区域的内部或外部。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input study area polygons")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _in_study_area { get; set; } = null;


        public GALayer3DToNetCDF SetEnv(object extent = null, object geographicTransformations = null, object outputCoordinateSystem = null, object parallelProcessingFactor = null, object workspace = null)
        {
            base.SetEnv(extent: extent, geographicTransformations: geographicTransformations, outputCoordinateSystem: outputCoordinateSystem, parallelProcessingFactor: parallelProcessingFactor, workspace: workspace);
            return this;
        }

    }

}